﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Web;
using Tibet.Logica;
using Tibet.Datos;
using System.Diagnostics;

namespace Tibet.Logica
{
    /// <summary>
    /// Clase para la gestión del archivo de configuración del proyecto
    /// </summary>
    public class ConfiguracionTibet
    {
        /// <summary>
        /// Agrega una nueva sección de email al archivo de configuración
        /// </summary>
        /// <param name="csgr">Grupo de secciones del archivo</param>
        /// <param name="email">Correo electrónico a agregar al archivo</param>
        private void AgregarSeccionCorreo(ConfigurationSectionGroup csgr,
            string email)
        {
            // Agregando sección de configuración de correos electrónicos
            ConfiguracionCorreo configuracionCorreo =
                new ConfiguracionCorreo();
            configuracionCorreo.Email = email;
            csgr.Sections.Add("ConfiguracionCorreo",
                configuracionCorreo);
        }

        /// <summary>
        /// Agrega una nueva sección de BD al archivo de configuración 
        /// </summary>
        /// <param name="csgr">Grupo de secciones del archivo</param>
        /// <param name="nombre">Nombre de la base de datos</param>
        /// <param name="usuario">Usuario de la base de datos</param>
        /// <param name="password">Password de la base de datos</param>
        private void AgregarSeccionConfiguracionBD
            (ConfigurationSectionGroup csgr, string nombre, string usuario,
            string password, string fuenteDatos)
        {
            // Agregando sección de configuración BD
            ConfiguracionBD configuracionBD = new ConfiguracionBD();
            configuracionBD.Nombre = nombre;
            configuracionBD.Usuario = usuario;
            configuracionBD.Password = password;
            configuracionBD.FuenteDatos = fuenteDatos;

            Conexion conn = new Conexion(nombre, fuenteDatos);

            configuracionBD.ConnectionString = "Data Source =" + fuenteDatos + ";" + "Initial Catalog =" + nombre + ";" + "Integrated Security = SSPI;"; 
       
            csgr.Sections.Add("ConfiguracionBD", configuracionBD);
        }

        /// <summary>
        /// Agrega una nueva sección de SVN al archivo de configuración 
        /// </summary>
        /// <param name="csgr">Grupo de secciones del archivo</param>
        /// <param name="nombre">Nombre del repositorio</param>
        /// <param name="url">URL del repositorio</param>
        private void AgregarSeccionConfiguracionSVN
            (ConfigurationSectionGroup csgr, string nombre, string url)
        {
            // Agregando sección de configuración SVN
            ConfiguracionSVN configuracionSVN = new ConfiguracionSVN();
            configuracionSVN.Nombre = nombre;
            configuracionSVN.Url = url;
            csgr.Sections.Add("ConfiguracionSVN", configuracionSVN);
        }

        /// <summary>
        /// Actualiza el archivo de configuración
        /// </summary>
        /// <param name="nombreSVN">Nombre del repositorio</param>
        /// <param name="url">URL del repositorio</param>
        /// <param name="nombreBD">Nombre de la base de datos</param>
        /// <param name="usuario">Usuario de la base de datos</param>
        /// <param name="password">Password de la base de datos</param>
        /// <param name="email">Correo electrónico</param>
        /// <returns>Actualización del archivo de configuración</returns>
        public Boolean ActualizarWebConfig(string nombreSVN, string url,
            string nombreBD, string usuario, string password, string email,
            string fuenteDatos)
        {
            //Actualizando archivo de configuración del sistema
            Boolean resultado = false;
            try
            {
                System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
                config.SectionGroups.Remove("ConfiguracionTibet");
                config.SectionGroups.Add("ConfiguracionTibet",
                    new ConfigurationSectionGroup());
                ConfigurationSectionGroup csgr =
                    config.SectionGroups.Get("ConfiguracionTibet");
                AgregarSeccionConfiguracionSVN(csgr, nombreSVN, url);
                AgregarSeccionConfiguracionBD(csgr, nombreBD, usuario,
                    password, fuenteDatos);
                AgregarSeccionCorreo(csgr, email);
                config.Save(ConfigurationSaveMode.Modified);
                resultado = true;
            }
            catch (Exception e)
            {
                resultado = false;
            }
            return resultado;
        }

        /// <summary>
        /// Obtiene el correo electrónico configurado en el Web.config
        /// </summary>
        /// <returns>Correo electrónico configurado en el Web.config</returns>
        public string ObtenerCorreoElectronico()
        {
            string correoElectronico = "No configurado";
            ConfigurationSectionGroup csg = new ConfigurationSectionGroup();
            System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
            csg = config.SectionGroups.Get("ConfiguracionTibet");
            if (csg != null)
            {
                ConfiguracionCorreo configuracionCorreo =
                    (ConfiguracionCorreo)csg.Sections.
                    Get("ConfiguracionCorreo");
                configuracionCorreo.Email = correoElectronico;
            }
            return correoElectronico;
        }

        /// <summary>
        /// Obtiene el nombre del repositorio configurado en el Web.config
        /// </summary>
        /// <returns>>
        /// Nombre del repositorio configurado en el Web.config
        /// </returns>
        public string ObtenerNombreRepositorio()
        {
            string nombreRepositorio = "No configurado";
            ConfigurationSectionGroup csg = new ConfigurationSectionGroup();
            System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
            csg = config.SectionGroups.Get("ConfiguracionTibet");
            if (csg != null)
            {
                ConfiguracionSVN configuracionSVN =
                    (ConfiguracionSVN)csg.Sections.
                    Get("ConfiguracionSVN");
                configuracionSVN.Nombre = nombreRepositorio;
            }
            return nombreRepositorio;
        }

        /// <summary>
        /// Obtiene la url del repositorio configurada en el Web.config
        /// </summary>
        /// <returns>Url del repositorio configurada en el Web.config</returns>
        public string ObtenerUrlRepositorio()
        {
            string urlRepositorio = "No configurado";
            ConfigurationSectionGroup csg = new ConfigurationSectionGroup();
            System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
            csg = config.SectionGroups.Get("ConfiguracionTibet");
            if (csg != null)
            {
                ConfiguracionSVN configuracionSVN =
                    (ConfiguracionSVN)csg.Sections.
                    Get("ConfiguracionSVN");
                configuracionSVN.Url = urlRepositorio;
            }
            return urlRepositorio;
        }

        /// <summary>
        /// Obtiene el nombre de la base de datos configurado en el Web.config
        /// </summary>
        /// <returns>
        /// Nombre de la base de datos configurado en el Web.config
        /// </returns>
        public string ObtenerNombreBD()
        {
            string nombreBD = "No configurado";
            ConfigurationSectionGroup csg = new ConfigurationSectionGroup();
            System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
            csg = config.SectionGroups.Get("ConfiguracionTibet");
            if (csg != null)
            {
                ConfiguracionBD configuracionBD =
                    (ConfiguracionBD)csg.Sections.
                    Get("ConfiguracionBD");
                configuracionBD.Nombre = nombreBD;
            }
            return nombreBD;
        }

        /// <summary>
        /// Obtiene el usuario de la base de datos configurado en el Web.config
        /// </summary>
        /// <returns>
        /// Usuario de la base de datos configurado en el Web.config
        /// </returns>
        public string ObtenerUsuario()
        {
            string usuario = "No configurado";
            ConfigurationSectionGroup csg = new ConfigurationSectionGroup();
            System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
            csg = config.SectionGroups.Get("ConfiguracionTibet");
            if (csg != null)
            {
                ConfiguracionBD configuracionBD =
                    (ConfiguracionBD)csg.Sections.
                    Get("ConfiguracionBD");
                configuracionBD.Usuario = usuario;
            }
            return usuario;
        }

        /// <summary>
        /// Obtiene el password de la base de datos configurado en el 
        /// Web.config
        /// </summary>
        /// <returns>
        /// Password de la base de datos configurado en el Web.config
        /// </returns>
        public string ObtenerPassword()
        {
            string password = "No configurado";
            ConfigurationSectionGroup csg = new ConfigurationSectionGroup();
            System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
            csg = config.SectionGroups.Get("ConfiguracionTibet");
            if (csg != null)
            {
                ConfiguracionBD configuracionBD =
                    (ConfiguracionBD)csg.Sections.
                    Get("ConfiguracionBD");
                configuracionBD.Password = password;
            }
            return password;
        }

        public string ObtenerFuentedeDatos()
        {
            string fuentededatos = "No configurado";
            ConfigurationSectionGroup csg = new ConfigurationSectionGroup();
            System.Configuration.Configuration config =
                    System.Web.Configuration.WebConfigurationManager.
                    OpenWebConfiguration("~");
            csg = config.SectionGroups.Get("ConfiguracionTibet");
            if (csg != null)
            {
                ConfiguracionBD configuracionBD =
                    (ConfiguracionBD)csg.Sections.
                    Get("ConfiguracionBD");
                configuracionBD.FuenteDatos = fuentededatos;
            }
            return fuentededatos;
        }
    }
}